package com.jvyou.proxy.jdk;

import com.jvyou.proxy.Marry;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author 橘柚
 * @version 1.0-SNAPSHOT
 * @Date 2024/5/23 21:35
 * @Description JDK动态代理
 */
public class JdkMarryProxy implements InvocationHandler {

    // 代理的目标对象
    private final Marry target;

    public JdkMarryProxy(Marry target) {
        this.target = target;
    }

    /**
     * loader：动态代理类在运行时通过类加载器加载到 JVM 中，通常使用被代理类的类加载器来加载动态代理类
     * interfaces：表示被代理类实现的接口列表，动态代理类会实现这些接口。可以使用`target.getClass().getInterfaces()`
     * 如果你已经知道了被代理类实现的接口，则可以直接使用`new Class[]{接口.class}`来指定。
     * handler：表示代理类中处理方法调用的逻辑，通常使用代理类对象来实现。
     *
     * @return 代理类对象
     */
    public Marry getInstance() {
        return (Marry) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                new Class[]{Marry.class}, // 被代理类实现的接口列表,这里已经知道被代理类实现了Marry接口，否则需要使用target.getClass().getInterfaces()
                this
        );
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理结婚开始");
        Object result = method.invoke(target, args);
        System.out.println("代理结婚结束");
        return result;
    }
}
